package com.xzx.helloworld;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

import java.util.Date;

/**
 * 在TCP/IP 栈中，接收的数据都存储在socker buffer中
 * 这个buffer是基于字节队列的  并不是基于 数据package 队列的
 * 所以即使对方发送了两个独立的数据包package，但是到服务器端，数据都会被接收到一个字节队列中，会视为一堆字节，
 * 所以会造成 收到和发送的数据不一致的问题
 * 本示例中是发送一个4字节的int数据，4字节比较小，所以没有出现数据的碎片化，但是如果发的越多的数据，就会产生数据碎片化，
 * @author xinzhixuan
 * @version 1.0
 * @date 2025/10/14 18:21
 */
public class TimerClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("channelRead");
        ByteBuf in = (ByteBuf) msg;
        try {
            long currentTimeMillis = (in.readUnsignedInt() - 2208988800L) * 1000L;
            System.out.println(new Date(currentTimeMillis));
        } finally {
            ReferenceCountUtil.release(msg); // (2)
        }
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("exceptionCaught");
        cause.printStackTrace();
        ctx.close();
    }
}
